/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rhdtp.demopf.control.admin;

import com.rhdtp.demopf.model.dao.ActorDAO;
import com.rhdtp.demopf.model.dao.DirectorDAO;
import com.rhdtp.demopf.model.dao.PeliculaDAO;
import com.rhdtp.demopf.model.dto.Actor;
import com.rhdtp.demopf.model.dto.Director;
import com.rhdtp.demopf.model.dto.Pelicula;
import com.rhdtp.demopf.security.UserSession;
import com.rhdtp.demopf.services.ImageService;
import java.io.IOException;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

/**
 *
 * @author rhdtp
 */
public class CatalogoPelicula implements Serializable {

    private static final Logger logger = Logger.getLogger(CatalogoPelicula.class);
    private ImageService imageService;
    private Pelicula pelicula;
    private UploadedFile portada;
    private ActorDAO actorDAO;
    private PeliculaDAO peliculaDAO;
    private DirectorDAO directorDAO;
    private UserSession userSession;
    private List<Pelicula> peliculasFilter;

    public CatalogoPelicula() {
    }

    public void cargaPortada() {
        String ext = null;
        int i = portada.getFileName().lastIndexOf('.');
        if (i > 0) {
            ext = portada.getFileName().substring(i + 1);
        }
        pelicula.setTipoPortada(ext);
        try {
            byte[] p = IOUtils.toByteArray(portada.getInputstream());
            pelicula.setPortada(p);
        } catch (IOException e) {
            logger.debug("Exepción: " + e);
        }

        if (pelicula.getPortada() != null) {
            msgInfo("Info.", "Portada cargada con exito");
        } else {
            msgError("Error", "Error al cargar la portada");
        }
    }

    public void save() {

        if (pelicula.getId() != 0) {
            peliculaDAO.update(pelicula);
            msgInfo("Info.", "El Película: " + pelicula.getTitulo() + " ah sido actualizado correctamente.");
        } else {
            pelicula.setId(peliculaDAO.countId() + 1);
            peliculaDAO.save(pelicula);
            msgInfo("Info.", "El Película: " + pelicula.getTitulo() + " ah sido guardado correctamente.");
        }
        imageService.addImage(pelicula);
        init();
    }

    public void edit(Pelicula pe) {
        pelicula = peliculaDAO.load(pe);
        RequestContext.getCurrentInstance().scrollTo("registro:formulario");
    }

    public void remove(Pelicula pe) {
        if (peliculaDAO.delete(pe)) {
            msgInfo("Info.", "El Película: " + pe.getTitulo() + " a sido borrado correctamente.");
        } else {
            msgError("Error", "No se pudo borrar el Película, esto puede ser porque tiene algún registro dependiente");
        }
    }

    public void resetForm() {
        init();
        RequestContext.getCurrentInstance().reset("registro:formulario");
    }

    @PostConstruct
    public void init() {
        pelicula = new Pelicula();
        pelicula.setActor(new Actor());
        pelicula.setDirector(new Director());
        peliculasFilter = null;
    }

    public void msgInfo(String summary, String detail) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, summary, detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public void msgError(String summary, String detail) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public void msgWarning(String summary, String detail) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, summary, detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public List<Pelicula> getPeliculas() {
        return peliculaDAO.list();
    }

    public List<Director> getDirectors() {
        return directorDAO.list();
    }

    public List<Actor> getActors() {
        return actorDAO.list();
    }

    public Pelicula getPelicula() {
        return pelicula;
    }

    public void setPelicula(Pelicula pelicula) {
        this.pelicula = pelicula;
    }

    public void setPeliculaDAO(PeliculaDAO peliculaDAO) {
        this.peliculaDAO = peliculaDAO;
    }

    public UserSession getUserSession() {
        return userSession;
    }

    public void setUserSession(UserSession userSession) {
        this.userSession = userSession;
    }

    public List<Pelicula> getPeliculasFilter() {
        return peliculasFilter;
    }

    public void setPeliculasFilter(List<Pelicula> peliculasFilter) {
        this.peliculasFilter = peliculasFilter;
    }

    public ActorDAO getActorDAO() {
        return actorDAO;
    }

    public void setActorDAO(ActorDAO actorDAO) {
        this.actorDAO = actorDAO;
    }

    public DirectorDAO getDirectorDAO() {
        return directorDAO;
    }

    public void setDirectorDAO(DirectorDAO directorDAO) {
        this.directorDAO = directorDAO;
    }

    public ImageService getImageService() {
        return imageService;
    }

    public void setImageService(ImageService imageService) {
        this.imageService = imageService;
    }

    public UploadedFile getPortada() {
        return portada;
    }

    public void setPortada(UploadedFile portada) {
        this.portada = portada;
    }
}
